﻿using System;
using System.Threading.Tasks;
using System.Web;
using Kugar.Core.Web;
using Kugar.Web.Wechat.Entities;
using Kugar.Web.Wechat.Enums;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Filters;
using Senparc.NeuChar.App.AppStore;
using HttpContext = Microsoft.AspNetCore.Http.HttpContext;

namespace Kugar.Web.Wechat
{
    /// <summary>
    /// 用于处理微信授权过程中,需获取信息,以及事件处理函数
    /// </summary>
    //[Obsolete]
    //public interface IMPOAuthHandler
    //{
    //    /// <summary>
    //    /// 用于返回微信公众号的appid以及appSerect的函数
    //    /// </summary>
    //    /// <param name="filterContext"></param>
    //    /// <returns></returns>
    //    (string appID, string appSerect,string token) MPGetter(AuthorizationFilterContext controllerContext,ActionDescriptor actionDescriptor);

    //    /// <summary>
    //    /// 用户授权回调时,触发该函数,可以用于校验用户等
    //    /// </summary>
    //    /// <param name="appID">对应授权的appid</param>
    //    /// <param name="user">授权的用户信息</param>
    //    Task OnUserAuthorityAsync (string appID, WechatUserOAuth user, Controller context);

    //    /// <summary>
    //    /// 当前是否授权成功,如果授权不成功的话,则需要跳转到微信授权,如果已登录的,一般在这个函数里校验cookie或者header的值
    //    /// </summary>
    //    /// <param name="action"></param>
    //    /// <returns>如果授权检查成功,则返回true,,否则返回false</returns>
    //    Task<bool> CheckAuthority(AuthorizationFilterContext action);
    //}


    /// <summary>
    /// 用于处理微信授权过程中,需获取信息,以及事件处理函数
    /// </summary>
    public interface IMPOAuthWithSchemeHandler
    {
        /// <summary>
        /// 用于返回微信公众号的appid以及AppSecret的函数,如需根据不同routevalue确定多租户的,可在类的构造函数中,注入HttpContext和DbContext之类的
        /// </summary>
        /// <param name="scheme">当前授权的名称</param>
        /// <returns></returns>
        Task<(string appID, string appSecret, string token)> MPGetter(string scheme);

        Task<(string appID, string appSerect, string token, string wechatID, string AESKey, WeiXinType type)>
            GetMPInfoByAppID(string appID);

        /// <summary>
        /// 用户授权回调时,触发该函数,可以用于校验用户或注册用户等,并可返回需要添加到HttpContext.User中的数据
        /// </summary>
        /// <param name="appID">对应授权的appid</param>
        /// <param name="user">授权的用户信息</param>
        /// <param name="scheme">授权前访问的scheme名</param>
        Task<(string key,string value)[]> OnWechatAuthorityCallbackAsync(string appID, WechatUserOAuth user,string scheme);

        ///// <summary>
        ///// 当前是否授权成功,如果授权不成功的话,则需要跳转到微信授权,如果已登录的,一般在这个函数里校验cookie或者header的值
        ///// </summary>
        ///// <param name="action"></param>
        ///// <returns>如果授权检查成功,则返回true,,否则返回false</returns>
        //Task<(bool isChecked, WechatUserOAuth user)> OnCheckAuthority(Microsoft.AspNetCore.Http.HttpContext context,string openID, ActionDescriptor action);

    }
}
